from PyQt5.QtCore import QRunnable, QObject, pyqtSignal
import os
import json
import time


class StrategyGeneratorTaskSignals(QObject):
    status_signal = pyqtSignal(int, str)
    progress_signal = pyqtSignal(str)
    error_signal = pyqtSignal(str, str)


class StrategyGeneratorTask(QRunnable):
    def __init__(self, db_connector, ai_module, table_name, row, strategy_save_path):
        """
        初始化任务
        :param db_connector: 数据库连接对象
        :param ai_module: AI 模块，用于生成字段策略
        :param table_name: 当前处理的表名
        :param strategy_save_path: 策略保存路径
        :param db_connection_name: 当前数据库连接的名称
        """
        super().__init__()
        self.db_connector = db_connector
        self.ai_module = ai_module
        self.table_name = table_name
        self.row = row  # 行号
        self.strategy_save_path = strategy_save_path
        self.signals = StrategyGeneratorTaskSignals()

    def run(self):
        try:
            self.signals.status_signal.emit(self.row, "yellow")  # 发出当前行开始处理的信号

            self.signals.progress_signal.emit(f"表 {self.table_name} 开始从源库中加载建表DDL...")
            # 获取表的 DDL 脚本
            ddl_script = self.db_connector.get_table_ddl(self.table_name)
            time.sleep(0.5)  # 防止调用 AI 接口过于频繁

            self.signals.progress_signal.emit(f"表 {self.table_name} 开始调用AI为字段制定数据生成策略...")
            # 调用 AI 模块生成策略
            strategy = self.ai_module.generate_strategy(ddl_script)

            self.signals.progress_signal.emit(f"表 {self.table_name} 开始验证策略是否成功制定...")
            # 保存生成的策略到文件
            fn = self.save_strategy_to_file(strategy)
            self.signals.progress_signal.emit(f"表 {self.table_name} 的字段生成策略已成功保存到文件{fn}...")
            self.signals.status_signal.emit(self.row, "green")
        except Exception as e:
            self.signals.error_signal.emit(self.table_name, str(e))
            self.signals.status_signal.emit(self.table_name, "red")

    def save_strategy_to_file(self, strategy):
        """
        保存生成的策略到 JSON 文件
        :param strategy: AI 生成的字段策略（应为 Python 字典）
        """
        # 如果 strategy 是字符串，尝试将其解析为 Python 字典
        if isinstance(strategy, str):
            try:
                # 找到第一个 '{' 和最后一个 '}'
                start_idx = strategy.find('{')
                end_idx = strategy.rfind('}')

                # 如果没有找到有效的 JSON 部分，抛出异常
                if start_idx == -1 or end_idx == -1:
                    raise ValueError("未找到有效的 JSON 数据")
                strategy = strategy[start_idx:end_idx + 1]
                strategy = json.loads(strategy)
            except json.JSONDecodeError as e:
                raise ValueError(f"字段生成策略不是合法的 JSON 格式: {e}")

        # 确保保存路径存在
        os.makedirs(self.strategy_save_path, exist_ok=True)

        # 生成文件路径
        file_name = f"{self.db_connector.get_connector_name()}_{self.table_name}.json"
        file_path = os.path.join(self.strategy_save_path, file_name)

        # 保存文件
        try:
            with open(file_path, "w", encoding="utf-8") as file:
                # 使用 `json.dump` 保存为纯 JSON 格式
                json.dump(strategy, file, indent=4, ensure_ascii=False)
            return file_name
        except Exception as e:
            raise IOError(f"保存文件 {file_path} 时出错: {e}")